package x.ovo.wechat.bot.plugin;

import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.dromara.hutool.core.date.DateUtil;
import org.dromara.hutool.core.io.file.FileUtil;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.http.HttpUtil;
import org.dromara.hutool.http.client.HttpDownloader;
import org.dromara.hutool.json.JSONUtil;
import x.ovo.wechat.bot.core.event.EventListener;
import x.ovo.wechat.bot.core.event.MessageEvent;
import x.ovo.wechat.bot.core.message.TextMessage;
import x.ovo.wechat.bot.core.plugin.Plugin;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;

@Slf4j(topic = "DailyNews")
public class DailyNewsListener extends EventListener<MessageEvent<TextMessage>, TextMessage> {

    /** 新闻网址 */
    private static final String NEWS_URL = "https://api.jun.la/60s.php?format=imgapi";
    /** Chigua 网址 */
    private static final String CHIGUA_URL = "https://dayu.qqsuu.cn/mingxingbagua/apis.php";
    /** 摸鱼日历api */
    private static final String RILI_URL = "https://api.vvhan.com/api/moyu?type=json";
    /** 视频日报 URL */
    private static final String VIDEO_URL = "https://dayu.qqsuu.cn/moyuribaoshipin/apis.php";

    private final Map<String, Consumer<TextMessage>> handlers = new HashMap<>();

    public DailyNewsListener(Plugin plugin) {
        super(plugin);
        this.handlers.put("今日新闻", this.news());
        this.handlers.put("今日吃瓜", this.chigua());
        this.handlers.put("摸鱼日历", this.moyurili());
        this.handlers.put("视频日报", this.video());
    }

    @Override
    public boolean support(@NonNull MessageEvent<TextMessage> textMessageMessageEvent, TextMessage textMessage) {
        return this.handlers.containsKey(textMessage.getContent());
    }

    @Override
    public boolean onEvent(@NonNull MessageEvent<TextMessage> textMessageMessageEvent, TextMessage textMessage) {
        try {
            this.handlers.get(textMessage.getContent()).accept(textMessage);
            return true;
        } catch (Exception e) {
            log.warn(e.getMessage());
            return false;
        }
    }

    private Consumer<TextMessage> news() {
        return message -> {
            File file = FileUtil.file(this.plugin.getDataDir(), "news.png");
            // 获取文件的最后修改时间
            String date = DateUtil.formatDate(FileUtil.lastModifiedTime(file));
            // 如果文件的最后修改时间不是今天，则是历史文件，删除重新下载
            if (!StrUtil.equals(date, DateUtil.formatToday())) {
                FileUtil.del(file);
                String s = HttpUtil.get(NEWS_URL);
                String url = JSONUtil.parseObj(s).getStr("imageBaidu");
                HttpDownloader.downloadFile(url, file);
            }
            boolean b = message.getFrom().sendImage(file);
            log.info("发送 每日新闻 {}", b ? "成功" : "失败");
        };
    }

    private Consumer<TextMessage> chigua() {
        return message -> {
            File file = FileUtil.file(this.plugin.getDataDir(), "chigua.png");
            // 获取文件的最后修改时间
            String date = DateUtil.formatDate(FileUtil.lastModifiedTime(file));
            // 如果文件的最后修改时间不是今天，则是历史文件，删除重新下载
            if (!StrUtil.equals(date, DateUtil.formatToday())) {
                FileUtil.del(file);
                HttpDownloader.downloadFile(CHIGUA_URL, file);
            }
            boolean b = message.getFrom().sendImage(file);
            log.info("发送 每日吃瓜 {}", b ? "成功" : "失败");
        };
    }

    private Consumer<TextMessage> moyurili() {
        return message -> {
            File file = FileUtil.file(this.plugin.getDataDir(), "rili.png");
            // 获取文件的最后修改时间
            String date = DateUtil.formatDate(FileUtil.lastModifiedTime(file));
            // 如果文件的最后修改时间不是今天，则是历史文件，删除重新下载
            if (!StrUtil.equals(date, DateUtil.formatToday())) {
                FileUtil.del(file);
                String s = HttpUtil.get(RILI_URL);
                String url = JSONUtil.parseObj(s).getStr("url");
                HttpDownloader.downloadFile(url, file);
            }
            boolean b = message.getFrom().sendImage(file);
            log.info("发送 摸鱼日历 {}", b ? "成功" : "失败");
        };
    }

    private Consumer<TextMessage> video() {
        return message -> {
            File file = FileUtil.file(this.plugin.getDataDir(), "video.mp4");
            // 获取文件的最后修改时间
            String date = DateUtil.formatDate(FileUtil.lastModifiedTime(file));
            // 如果文件的最后修改时间不是今天，则是历史文件，删除重新下载
            if (!StrUtil.equals(date, DateUtil.formatToday())) {
                FileUtil.del(file);
                HttpDownloader.downloadFile(VIDEO_URL, file);
            }
            boolean b = message.getFrom().sendVideo(file);
            log.info("发送 视频日报 {}", b ? "成功" : "失败");
        };
    }

    @Override
    public boolean executeNext() {
        return false;
    }
}
